Use case: Command process operation

Sequence diagram

Send command operation

  @startuml

  participant App as "User application"
  participant HAL as "HAL Driver"

  == Process ==
  App -> HAL : HAL_SDRAM_SendCommand(&hsdram, &Command, Timeout)
  App <-- HAL : hal_status : HAL_OK or HAL_ERROR

  @enduml

Code snippet

HAL1

HAL2

All bank precharge command

FMC_SDRAM_CommandTypeDef Command;
Command.CommandMode = FMC_SDRAM_CMD_PALL;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;

HAL_SDRAM_SendCommand(&hsdram,
                      /* --- */
                      &Command,
                      1000
                     );

All bank precharge command

hal_sdram_command_t Command;
Command.command = HAL_SDRAM_COMMAND_PALL;
/* ----------------------------------- */
/* ----------------------------------- */
/* ----------------------------------- */

HAL_SDRAM_SendCommand(&hsdram,
                     HAL_SDRAM_DEVICE1,
                     &Command,
                     1000
                    );

Clock Enable command

FMC_SDRAM_CommandTypeDef Command;
Command.CommandMode = FMC_SDRAM_CMD_CLK_ENABLE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = 0;

HAL_SDRAM_SendCommand(&hsdram,
                      &Command,
                      1000
                     );

Clock Enable command

hal_sdram_command_t Command;
Command.command = HAL_SDRAM_COMMAND_CLK_ENABLE;
/* ----------------------------------- */
/* ----------------------------------- */
/* ----------------------------------- */

HAL_SDRAM_SendCommand(&hsdram,
                     HAL_SDRAM_DEVICE1,
                     &Command,
                     1000
                    );

Auto refresh mode command

FMC_SDRAM_CommandTypeDef Command;
Command.CommandMode = FMC_SDRAM_CMD_AUTOREFRESH_MODE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK1;
Command.AutoRefreshNumber = 8;
Command.ModeRegisterDefinition = 0;

HAL_SDRAM_SendCommand(&hsdram,
                      &Command,
                      SDRAM_TIMEOUT
                     );

Auto refresh mode command

hal_sdram_command_t Command;
Command.command = HAL_SDRAM_COMMAND_CLK_ENABLE;
/* ----------------------------------- */
Command.parameter = 800;
/* ----------------------------------- */

HAL_SDRAM_SendCommand(&hsdram,
                     HAL_SDRAM_DEVICE1,
                     &Command,
                     1000
                    );

Load mode command

#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000)
#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200)

FMC_SDRAM_CommandTypeDef Command;
tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1          |
                     SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
                     SDRAM_MODEREG_CAS_LATENCY_3           |
                     SDRAM_MODEREG_OPERATING_MODE_STANDARD |
                     SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;

Command.CommandMode = FMC_SDRAM_CMD_LOAD_MODE;
Command.CommandTarget = FMC_SDRAM_CMD_TARGET_BANK2;
Command.AutoRefreshNumber = 1;
Command.ModeRegisterDefinition = tmpmrd;

HAL_SDRAM_SendCommand(&hsdram,
                      &Command,
                      1000
                     );

Load mode command

#define SDRAM_MODEREG_BURST_LENGTH_1 ((uint16_t)0x0000)
#define SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL ((uint16_t)0x0000)
#define SDRAM_MODEREG_CAS_LATENCY_3 ((uint16_t)0x0030)
#define SDRAM_MODEREG_OPERATING_MODE_STANDARD ((uint16_t)0x0000)
#define SDRAM_MODEREG_WRITEBURST_MODE_SINGLE ((uint16_t)0x0200)

hal_sdram_command_t Command;
tmpmrd = (uint32_t)SDRAM_MODEREG_BURST_LENGTH_1          |
                     SDRAM_MODEREG_BURST_TYPE_SEQUENTIAL   |
                     SDRAM_MODEREG_CAS_LATENCY_3           |
                     SDRAM_MODEREG_OPERATING_MODE_STANDARD |
                     SDRAM_MODEREG_WRITEBURST_MODE_SINGLE;

Command.command = HAL_SDRAM_COMMAND_LOAD;
/* ----------------------------------- */
/* ----------------------------------- */
Command.parameter = tmpmrd;

HAL_SDRAM_SendCommand(&hsdram,
                     HAL_SDRAM_DEVICE1,
                     &Command,
                     1000
                    );

Key changes

  1. HAL2 requires the target device (HAL_SDRAM_DEVICEx) when sending a command.